package cn.shuto.liferay.plugin.chart.portlet.admin.search;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Locale;

import javax.portlet.PortletURL;

import cn.shuto.liferay.plugin.chart.service.model.Option;
import cn.shuto.liferay.plugin.chart.service.service.OptionLocalServiceUtil;
import cn.shuto.liferay.plugin.chart.service.service.persistence.OptionActionableDynamicQuery;

import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.search.BaseIndexer;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchEngineUtil;
import com.liferay.portal.kernel.search.Summary;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.security.permission.PermissionChecker;

public class OptionIndexer extends BaseIndexer {
	// 所有的Liferay *Indexer 类都惯例定义 CLASS_NAMES 和 PORTLET_ID 变量
	public static final String[] CLASS_NAMES = { Option.class.getName() };

	public static final String PORTLET_ID = "chart-admin";

	public OptionIndexer() {
		// 当indexer返回结果时需要考虑权限
		// 当不调用或者设置为false时，indexer将返回匹配查询条件的所有实体，而且不考虑权限限制
		setPermissionAware(true);
	}

	@Override
	public String[] getClassNames() {
		return CLASS_NAMES;
	}

	@Override
	public String getPortletId() {
		return PORTLET_ID;
	}

	@Override
	public boolean hasPermission(PermissionChecker permissionChecker,
			String entryClassName, long entryClassPK, String actionId)
			throws Exception {
		// TODO Auto-generated method stub
		return super.hasPermission(permissionChecker, entryClassName,
				entryClassPK, actionId);
	}

	// 当删除参数对象对应的document的时调用此方法
	// 需要将object强制类型转换为需要的实体对象，然后调用BaseIndexer类的方法 deleteDocument ，需要提供实体的
	// company ID 和 entry ID两个参数
	@Override
	protected void doDelete(Object obj) throws Exception {
		Option option = (Option) obj;
		deleteDocument(option.getCompanyId(), option.getOptionId());
	}
	//在此方法中指定需要添加到Lucene文档中的实体的字段。
	//首先，需要将object强制类型转换为需要的实体对象，然后调用BaseIndexer 的getBaseModelDocument 方法
	//获取实体相应的文档。
	//然后添加你想要添加到文档索引 的实体字段。你需要针对不同的字段类型使用适当的方法添加字段，
	//默认情况下只有三个文档字段可以搜索使用Liferay的LuceneIndexSearcher：content, description, 和 title
	//如果你想其他字段也可以搜索，你可以在SearchContext中添加自定义。
	@Override
	protected Document doGetDocument(Object obj) throws Exception {
		Option option = (Option) obj;
		Document document = getBaseModelDocument(PORTLET_ID, option);
		document.addDate(Field.MODIFIED_DATE, option.getModifiedDate());

		document.addText(Field.TITLE, option.getName());
		document.addText(Field.CONTENT, option.getDescription());

		document.addKeyword(Field.GROUP_ID, getSiteGroupId(option.getGroupId()));
		document.addKeyword(Field.SCOPE_GROUP_ID, option.getGroupId());

		return document;
	}

	/*
	 * 可以使用BaseIndexer的createSummary 方法简单的实现此方法。
	 * 需要使用summary.setMaxContentLength定义内容提要的最大值，因为在Summary 类中没有定义此属性
	 */
	@Override
	protected Summary doGetSummary(Document document, Locale locale,
			String snippet, PortletURL portletURL) throws Exception {
		Summary summary = createSummary(document);

		summary.setMaxContentLength(200);

		return summary;
	}

	/*
	 * 
	 */
	@Override
	protected void doReindex(Object obj) throws Exception {
		Option option = (Option) obj;

		Document document = getDocument(option);

		SearchEngineUtil.updateDocument(getSearchEngineId(),
				option.getCompanyId(), document);

	}

	@Override
	protected void doReindex(String className, long classPK) throws Exception {
		Option option = OptionLocalServiceUtil.getOption(classPK);
		doReindex(option);
	}

	@Override
	protected void doReindex(String[] ids) throws Exception {
		long companyId = GetterUtil.getLong(ids[0]);

		reindexEntries(companyId);
	}

	@Override
	protected String getPortletId(SearchContext searchContext) {
		return PORTLET_ID;
	}

	protected void reindexEntries(long companyId) throws SystemException,
			PortalException {
		final Collection<Document> documents = new ArrayList<Document>();

		ActionableDynamicQuery actionableDynamicQuery = new OptionActionableDynamicQuery() {

			@Override
			protected void performAction(Object object) throws PortalException,
					SystemException {
				Option option = (Option) object;
				Document document = getDocument(option);

				documents.add(document);
			}
		};
		actionableDynamicQuery.setCompanyId(companyId);
		actionableDynamicQuery.performActions();

		SearchEngineUtil.updateDocuments(getSearchEngineId(), companyId,
				documents);
	}

}
